<?php

namespace App\Models;

use App\Models\Category\Category;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Jedrzej\Pimpable\PimpableTrait;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    use PimpableTrait;

    /**
     * 可执行搜索的字段
     */
    public $searchable = [
        'id',
        'account',
        'phone',
        'real_name',
        'sex',
        'nickname',
        'email',
        'level',
        'status',
        'group_id',
        'label_id',
        'user_type',
        'login_type',
        'pay_count',
        'is_promoter',
        'is_member',
        'is_forever_member',
        'country'
    ];

    public $casts = [
        'member_time' => 'date',
        'created_at' => 'date',
    ];

    /**
     * 可进行模糊查询的字段
     */
    public $searchableModels = [
        'nickname' => '%field%',
        'created_at' => '%field%',
        'updated_at' => '%field%',
        'user_type' => '%field%',
    ];

    /**
     * 会员来源的类型
     */
    public $memberSourceEnum = [
        'purchasegoods' => '购买商品获得',
        'spendmoney' => '花钱购买',
        'membercard' => '会员卡领取'
    ];

    /**
     * 用户登录类型
     */
    public $loginTypeEnum = [
        'h5' => '移动端登录',
        'wechat' => '微信登录',
        'Pc' => '电脑端登录'
    ];

    /**
     * 用户类型
     */
    public $userTypeEnum = [
        'officialAccount' => '微信公众号用户',
        'applet' => '微信小程序用户',
        'h5' => 'H5',
        'pc' => 'PC',
        'app' => 'APP'
    ];

    /**
     *可批量赋值字段
     */
    public $fillable = [
        'account',
        'password',
        'real_name',
        'sex',
        'birthday',
        'card_id',
        'remark',
        'nickname',
        'avatar',
        'phone',
        'level',
        'is_extension',
        'experience',
        'partner_id',
        'group_id',
        'status',
        'spread_id',
        'is_promoter',
        'addres',
        'promoter_id',
        'system_admin_id',
        'created_at',
        'update_at'
    ];

    /**
     * 进行排序的字段
     */
    public $sortable = [
        'id',
        'last_time',
        'pay_count',
        'experience',
        'balance',
        'level',
    ];

    /**
     * 默认使用倒叙的字段
     */
    public $defaultSortCriteria = ['id,desc'];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * 多对多的方式 通过中间的用户标签关联表 关联到用户的标签表
     */
    public function userLabel()
    {
        return $this->belongsToMany(   //使用多对多的方法的方法 belongsToMany() 来进行关联用户的标签
            UserLabel::class,  //要多对多关联的远程的表
            'user_label_relations',  //中间进行关联的表
            'user_id',  // 中间模型关联到本模型的外键
            'label_id'  //  中间模型关联到远端模型的外键
        );
    }

    /**
     * 多对多的方式 通过中间的用户好友关联表 关联到用户表
     */
    public function userfriends()
    {

//        return $this->belongsToMany(   //使用多对多的方法的方法 belongsToMany() 来进行关联用户的标签
//            User::class,  //要多对多关联的远程的表
//            'user_friends',  //中间进行关联的表
//            'user_id',  // 中间模型关联到本模型的外键
//            'friends_uid'  //  中间模型关联到远端模型的外键
//        );

//使用远程1对多的方法 进行查询用户得好友信息
        return $this->hasManyThrough(
            User::class,  //要关联得远端得表
            UserFriends::class,  //中间得模型
            'user_id',  //中间模型和本模型所关联得键
            'id',   //
            'id',
            'friends_uid',
        );
    }

    //youh
    public function couponissueuser()
    {
        return $this->hasMany(StoreCouponIssueUser::class, 'user_id', 'id');
    }

    /**
     *用户对应的用户标签关联表
     */
    public function userLabelRelation()
    {
        return $this->hasMany(UserLabelRelation::class, 'user_id', 'id');
    }


    /**
     * 用户对应的用户地址表
     */
    public function userAddress()
    {
        return $this->hasMany(UserAddress::class, 'user_id', 'id');
    }

    /**
     *用户对应的账单表
     */
    public function userbillSum()
    {
        $this->userBill()->sum('number');
    }

    /**
     *用户对应的账单表
     */
    public function userbill()
    {
        return $this->hasMany(UserBill::class, 'user_id', 'id');
    }

    /**
     *用户对应佣金冻结记录表
     */
    public function userBrokerageFrozen()
    {
        return $this->hasMany(UserBrokerageFrozen::class, 'user_id', 'id');
    }

    /**
     *用户对应的登录日志表
     */
    public function userLoginLog()
    {
        return $this->hasMany(UserLoginLog::class, 'user_id', 'id');
    }

//    /**
//     * 使用远程 1对多的方式 进行关联 用户标签关联表 从而关联到用户的标签表
//     */
//    public function userLabel1(){
//        return $this->hasManyThrough(
//            UserLabel::class,  //最终要关联的模型
//            UserLabelRelation::class,  //中间的模型
//            'user_id',  //中间模型和本模型关联的字段 (本模型的外键) 中间模型中的字段
//            'id',  //最终关联模型的外键 最终关联的模型中的字段
//            'id',  //本模型和中间模型关联的键  本模型中的字段
//            'label_id'  // 中间模型和最终模型关联的外键中间模型的字段
//        );
//    }

    /**
     *用户对应的签到记录表
     */
    public function usersigns()
    {
        return $this->hasMany(UserSign::class, 'user_id', 'id');
    }

    /**
     *用户对应的优惠券发放记录表
     */
    public function storecouponuser()
    {
        return $this->hasMany(StoreCouponUser::class, 'user_id', 'id');
    }

    /**
     *用户对应的微信用户表
     */
    public function wechatUsers()
    {
        return $this->hasMany(WechatUser::class, 'user_id', 'id');
    }

    /**
     * 用户对应的等级表
     */
    public function levels()
    {
        return $this->hasOne(UserLevel::class, 'user_id', 'id');
    }

    /**
     *用户对应的用户提现表
     */
    public function userextract()
    {
        return $this->hasMany(UserExtract::class, 'user_id', 'id');
    }

    /**
     *用户对应的订单表
     */
    public function order()
    {
        return $this->hasMany(Order::class, 'user_id', 'id');
    }

    /**
     *推销员对应的订单表
     */
    public function promoterOrder()
    {
        return $this->hasMany(Order::class, 'promoter_id', 'id');
    }

    /**
     *用户对应的会员卡
     */
    public function memberCards()
    {
        return $this->hasMany(MemberCard::class, 'user_id', 'id');
    }

    /**
     * 用户的分销等级
     */
    public function PromoterLevel()
    {
        return $this->hasOne(PromoterLevel::class, 'user_id', 'id');
    }

    /**
     * 推广员的上级推广员
     */
    public function parent()
    {
        return $this->hasOne(User::class, 'id', 'promoter_id');
    }

    /**
     * 关联分类表 查找用户分组的名称
     */
    public function catrgory()
    {
        return $this->belongsTo(Category::class, 'group_id', 'id');
    }

    /**
     * 推广员的下级
     */
    public function children()
    {
        return $this->hasMany(User::class, 'promoter_id', 'id');
    }

    /**
     *用户对应的商户申请表
     */
    protected function merchantRegister()
    {
        return $this->hasMany(MerchantRegister::class, 'user_id', 'id');
    }

    /**
     *用户对应的用户分组表
     */
    protected function userGroup()
    {
        return $this->belongsTo(UserGroup::class, 'group_id', 'id');
    }

    /**
     *用户对应的发票管理
     */
    protected function userIncoice()
    {
        return $this->hasMany(UserInvoice::class, 'user_id', 'id');
    }

    /**
     *用户对应的用户通知表
     */
    protected function userNotice()
    {
        return $this->hasMany(UserNotice::class, 'user_id', 'id');
    }

    /**
     *用户对应的通知发送记录表
     */
    protected function userNoticeSee()
    {
        return $this->hasMany(UserNoticeSee::class, 'user_id', 'id');
    }

    /**
     *用户对应的充值记录表
     */
    protected function userRecharge()
    {
        return $this->hasMany(UserRecharge::class, 'user_id', 'id');
    }

    /**
     *用户对应的搜索表
     */
    protected function userSearch()
    {
        return $this->hasMany(UserSearch::class, 'user_id', 'id');
    }

    /**
     *用户对应的优惠券前台用户领取记录表
     */
    protected function storeCcouponIssueUser()
    {
        return $this->hasMany(StoreCouponIssueUser::class, 'user_id', 'id');
    }

    /**
     *用户对应的发票表
     */
    protected function storeOrderInvoice()
    {
        return $this->hasMany(StoreOrderInvoice::class, 'user_id', 'id');
    }

    /**
     *用户对应的购物车
     */
    public  function carts()
    {
        return $this->hasMany(Cart::class, 'user_id', 'id');
    }

    /**
     *用户对应的订单明细表
     */
    protected function orderEconomizes()
    {
        return $this->hasMany(OrderEconomize::class, 'user_id', 'id');
    }

    /**
     *用户对应的订单操作表
     */
    protected function orderLogs()
    {
        return $this->hasMany(OrderLog::class, 'user_id', 'id');
    }

    /**
     *用户对应的商品日志表
     */
    public  function productLogs()
    {
        return $this->hasMany(ProductLog::class, 'user_id', 'id');
    }

    /**
     *用户对应的商品关系表
     */
    protected function productRelations()
    {
        return $this->hasMany(ProductRelation::class, 'user_id', 'id');
    }

    /**
     *用户对应的购卡记录表
     */
    protected function otherOrders()
    {
        return $this->hasMany(OtherOrder::class, 'user_id', 'id');
    }

    /**
     *用户对应的配送员表
     */
    protected function deliveryServices()
    {
        return $this->hasMany(DeliveryService::class, 'user_id', 'id');
    }

    /**
     *用户对应的二维码表
     */
    protected function qrcodes()
    {
        return $this->hasMany(Qrcode::class, 'user_id', 'id');
    }

    /**
     *用户对应的访问记录表
     */
    protected function userVisits()
    {
        return $this->hasMany(UserVisit::class, 'user_id', 'id');
    }

    /**
     *用户对应的用户行为记录表
     */
    protected function wechatMessages()
    {
        return $this->hasMany(WechatMessage::class, 'user_id', 'id');
    }

    /**
     *用户对用的管理员id
     */
    protected function systemAdmins()
    {
        return $this->belongsTo(SystemAdmin::class, 'admin_id', 'id');
    }

    /**
     *用户对应的砍价表
     */
    protected function storeBargainUserHelps()
    {
        return $this->hasMany(StoreBargainUserHelp::class, 'user_id', 'id');
    }

    /**
     *用户对应的商品拼团表
     */
    protected function storePinks()
    {
        return $this->hasMany(StorePink::class, 'user_id', 'id');
    }

    /**
     *用户对应的客服表
     */
    protected function storeServices()
    {
        return $this->hasMany(StoreService::class, 'user_id', 'id');
    }

    /**
     *用户对应的客服反馈表
     */
    protected function storeServiceFeedback()
    {
        return $this->hasMany(StoreServiceFeedback::class, 'user_id', 'id');
    }

    /**
     *用户对应的店员
     */
    protected function systemStoreStaff()
    {
        return $this->hasMany(SystemStoreStaff::class, 'user_id', 'id');
    }

    /**
     *用户对应的会员表
     */
    protected function userLevels()
    {
        return $this->hasMany(UserLevel::class, 'user_id', 'id');
    }

    /**
     * 用户对应的积分日志表
     */
    public function userIntegral()
    {
        return $this->hasMany(Integrallog::class,'user_id','id');
    }

    /**
     * 用户对应的上级推广人的信息
     */
    public function promoter()
    {
        return $this->hasOne(User::class,'id','promoter_id');
    }
}
